home *** CD-ROM | disk | FTP | other *** search
/ Directorty Opus 5 - Magellan 2 / Opus 5 - Magellan 2.iso / Extras / Dopus-MidiPlay / Playmidi.dopus5 next >
Text File  |  1998-04-12  |  3KB  |  129 lines

  1. /* Arexx Script To play Midi Files for DOPUS 5
  2.    (C)1998 Raistlin 
  3.    Version 1.1
  4.     Now correctly handle names with spaces ....
  5.  
  6.    If you like this stuff, please send me a mail (elrond@club-internet.fr)
  7.  
  8.    Usage : DOpus5:ARexx/Playmidi.dopus5 {f} {Qp}
  9.            run asynchronously
  10. */
  11.  
  12. parse arg '"'file'"' portname .
  13.  
  14. if portname='' then
  15.    portname = 'DOPUS.1'
  16.  
  17. address DOPUS.1
  18.  
  19. options results
  20.  
  21. if ~show('l','rexxsupport.library') then
  22.    call addlib('rexxsupport.library',0,-30)
  23.  
  24. lister query source
  25. if rc>0 then do
  26.    dopus request '"No source selected." OK'
  27.    exit
  28.    end
  29.  
  30. parse var result handle .
  31.  
  32. lister set handle busy on
  33.  
  34. cuthere=lastpos('/',file)
  35. if cuthere=0 then
  36.    cuthere=pos(':',file)
  37. name=""substr(file,cuthere+1)""
  38.  
  39. lister set handle newprogress info bar abort
  40. lister set handle newprogress title 'Playing 'name' ...'
  41. lister set handle newprogress info 'Loading Instruments ...'
  42.  
  43. address command 'GM:'
  44. address command 'Run >T:gmplay <NIL: gm:GMPLAY <NIL: >PIPE:gm-output "'file'"'
  45.  
  46. open('temp','T:gmplay','r')
  47.  
  48. process = readln('temp')
  49. parse var process '[CLI ' process ']'
  50. close('temp')
  51. call delete('T:gmplay')
  52.  
  53. buffer=''
  54. open('gm','PIPE:gm-output','r')
  55. timer=0
  56. measure=0
  57. percent=0
  58. timerbak=-1
  59. ended=0
  60.  
  61. do until ended > 0
  62.    buffer=buffer||readch('gm',15)
  63.  
  64.    new=verify(buffer,'%','m')
  65.    loading=verify(buffer,'(','m')
  66.    ended=pos('Finished',buffer)
  67.  
  68. /* Gestion des erreurs ********************************/
  69.     if pos('Unable to initialize GM',buffer) >0 then do
  70.       address command 'Break' process 'C'
  71.       lister clear handle progress
  72.         lister set handle busy off
  73.         call close('gm')
  74.         lister request handle '"Unable to initialize GM" OK'
  75.         exit
  76.    end
  77.  
  78.    if pos('t open audio driver',buffer) >0 then do
  79.       address command 'Break' process 'C'
  80.       lister clear handle progress
  81.         lister set handle busy off
  82.         call close('gm')
  83.         lister request handle '"Cannot open audio driver" OK'
  84.         exit
  85.    end
  86. /******************************************************/
  87.  
  88.    lister query handle abort
  89.    if result then do
  90.       address command 'Break' process 'C'
  91.       lister clear handle progress
  92.         lister set handle busy off
  93.         call close('gm')
  94.       exit
  95.    end
  96.  
  97.     if loading >0 then do
  98.         line=left(buffer,loading-1)  
  99.         buffer=substr(buffer,loading+1)
  100.         samplepos=lastpos('Loading',line)
  101.       sample=substr(line,samplepos,loading-samplepos)
  102.         lister set handle newprogress info sample
  103.    end
  104.    else
  105.    if new >0 then do                    /* check for new line */
  106.       line=left(buffer,new-1)  
  107.         buffer=substr(buffer,new+1)
  108.  
  109.         pos0=pos('Time',line)
  110.       pos1=pos('Meas',line)
  111.         pos2=pos('Perc',line)
  112.  
  113.       if pos0 + pos1 + pos2 ~= 0 then do
  114.          timer   = substr(line,pos0+5,5)
  115.             measure = substr(line,pos1+8,pos2-pos1-8)
  116.             percent = substr(line,pos2+11,3)
  117.          
  118.          if timer ~= timerbak then do
  119.                lister set handle newprogress info 'Playing measure:'measure'     Time: 'timer
  120.                lister set handle newprogress bar 100 percent
  121.                 timerbak=timer
  122.          end
  123.         end
  124.    end
  125. end
  126.  
  127. call close('gm')
  128. lister clear handle progress
  129. lister set handle busy off